// ProjectName: go-learn-demo
// PackageName: redisybxb
// Description:
// Author: hy.bai
// Date: 2025-08-27 星期三 18:36

package redisybxb

import (
	"fmt"
	"log/slog"
)

// Set集合：特点是无序,且不可重复

func RedisSAdd() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 为Set集合添加元素,且支持插入任意个数据
	intCmd := client.SAdd(*ctx, "name-s", "name-hk-1", "name-hk-2", "name-hk-3", "name-hk-3", "name-hk-4", "name-hk-5")
	fmt.Println(intCmd.Val())
}

func RedisSCard() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 返回Set集合的元素的个数
	intCmd := client.SCard(*ctx, "name-s")
	fmt.Println("元素的个数是:", intCmd.Val())

}

// 判断元素是否在集合中
func RedisSIsMember() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 判断指定Set集合中，元素是否存在
	boolCmd := client.SIsMember(*ctx, "name-s", "name-hk-1")
	fmt.Println("元素是否在集合中:", boolCmd.Val())
}

func RedisSMembers() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 获取集合中所有的元素
	sliceCmd := client.SMembers(*ctx, "name-s")
	fmt.Println("集合中的元素是:", sliceCmd.Val())
}

func RedisSRem() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 删除Set集合中的指定元素
	intCmd := client.SRem(*ctx, "name-s", "name-hk-5")
	fmt.Println("删除元素个数:", intCmd.Val())
}

// 随机返回集合中的⼀个元素，并且删除这个元素
func RedisSPop() {
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 随机删除并返回Set集合中的一个元素
	stringCmd := client.SPop(*ctx, "name-s")
	fmt.Println("删除的元素是:", stringCmd.Val())
}

// 随机返回集合中的多个元素，并且删除这些元素
func RedisSPopN() {
	RedisSAdd()
	client, ctx, err := InitClient()
	if err != nil {
		slog.Error(fmt.Sprintf("Redis Init Error: %s", err.Error()))
	}
	// 随机返回集合中的2个元素，并且删除这些元素
	stringCmd := client.SPopN(*ctx, "name-s", 2)
	fmt.Println("删除的元素是:", stringCmd.Val())
}

// 当前go文件的调用入口
func TestSet() {
	RedisSPopN()
}
